Promise (JavaScript)
Promiseってなに?
Promiseで包んだ処理が失敗したか成功したかで処理を分岐して逐次処理っぽく処理できる
HTTPリクエストを投げて->成功したら->結果を表示する
歴史
Promise以前のコールバックは様々な書き方ができた
引数になにを入れるのかは自由
Promiseではインタフェースを統一
複雑な処理をパターン化できる
1.2 Promise Overview
then()でPromiseオブジェクトにコールバック関数の登録する
promise.then(onFulfilled /* promiseの値が成功(resolveした値が渡される) */ , onRejected /* 失敗(reject) */)
引数は両方オプショナル
エラー処理だけかきたいとき promise.catch(onRejected)
.catchは promise.then(undefined, onRejected) のエイリアス
cf. then.catch()
catch(failureCallback) は then(null, failureCallback)を短く記述するものです
1.2.2 Promiseの状態
.thenで登録した関数が呼ばれるのは1回限り
pendingの状態から遷移したときのみ
https://gyazo.com/9db4acf623c860f409e7826c0b2c11cb
2 Promiseの書き方
Promiseはコールバックよりもエラー処理が得意
2.3. コラム: Promiseは常に非同期?
then()呼び出し時にresolveが確定して、同期的に呼び出せたとしても非同期に呼び出される
コードの実行順序を一意にするための仕様
2.6. コラム: thenは常に新しいpromiseオブジェクトを返す
2.7.1. コールバックで複数の非同期処理
コールバック大変なのでPromise使おうという例
function Hoge(callback, error, val)があったとき
Hoge.bind(null, callbackImpl)とするとHogeの第一引数をcallback固定にした関数を返す
function Hoge'(error, val) //callbackを利用している個所がcallbackImpl()になる が返るということ
2.8. Promise.all
Promiseの配列を渡すと非同期実行してくれる
結果の順番は保証される
2.9. Promise.race
どれか一つでも終わったら結果を返す
他のリクエストがキャンセルされるわけではない
2.10. then or catch?
.then のonRejectedが扱う処理は、その(またはそれ以前の)promiseオブジェクトに対してであって、 .then に書かれたonFulfilledは対象ではない
疑問
Q. .then().then().catch()したとき上層のエラーも下層でcatchするの?
https://gyazo.com/0b5ab9dba17eeeadde0e3f852e24d76d
onRejectedがundefined ほ素通しされるみたいな実装になっている? kadoyau.icon
Q. コンストラクタ new Promise(function(resolve, reject) { ... } );のresolveとかrejectなに
当該promiseをresolveしたりrejectするためのexecutorとよばれる関数
理解度クイズ